#include "Copa.h"

#include <Algoritmo1D.h>
#include <Bezier.h>
#include <glm/gtx/random.hpp>
#include <glm\gtc\random.hpp>


Copa::Copa() :
	m_superficie( std::unique_ptr<Algoritmo1D>( new Bezier() ) )
{
	// Funciones posible para randomizar
	//glm::gaussRand(2.0f, 0.5f);
	//glm::linearRand(1.5f, 3.0f)

	std::vector< glm::vec3 > vecPtsControl;
	vecPtsControl.push_back( glm::vec3(0.01f, 0.0f, -1.0f) );
	//vecPtsControl.push_back( glm::vec3(2.0f, 0.0f, 0.0f) );
	//vecPtsControl.push_back( glm::vec3(1.0f, 0.0f, 2.0f) );
	//vecPtsControl.push_back( glm::vec3(0.01f, 0.0f, 2.0f) );

	vecPtsControl.push_back( glm::vec3(glm::linearRand(1.5f, 3.0f), 0.0f, 0.0f) );
	vecPtsControl.push_back( glm::vec3(glm::linearRand(0.8f, 1.5f), 0.0f, glm::linearRand(1.5f, 3.0f)) );
	vecPtsControl.push_back( glm::vec3(0.01f, 0.0f, glm::linearRand(1.4f, 5.0f)) );

	glm::vec3 ejeRevolucion(0.0f, 0.0f, 1.0f);

	this->m_superficie.init( vecPtsControl, ejeRevolucion );
}


void Copa::init(const glm::vec3 &DireccionLuz, std::string vertShaderFileName, std::string fragShaderFileName) {
	this->m_superficie.build(24, 16);

	Renderizable::init(DireccionLuz, vertShaderFileName, fragShaderFileName);
	Renderizable::setMaterial( glm::vec3(0.853f, 0.771f, 0.594f), glm::vec3(0.317f, 0.29f, 0.231f), glm::vec3(0.47f, 0.43f, 0.35f), 2.0f );
	Renderizable::setTextura("hojasVerdes_1.dds");
}


void Copa::renderizar(const glm::mat4 &matVista, const glm::mat4 &matProyeccion, const glm::mat4 &matModelo) const {
	// Carga el shader
	Renderizable::cargarShaderProgram();

	// Empieza a dibujar todo
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_NORMAL_ARRAY);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);

	// Las matrices de transformacion, iluminacion y textura
	Renderizable::cargarMatricesTransformacion(matVista, matProyeccion, matModelo);
	Renderizable::cargarDatosIluminacion(matModelo, matVista);
	Renderizable::cargarTextura();

	// Los datos de las superficies
	std::vector< glm::vec3 > vecVertices = this->m_superficie.getVertices();
	std::vector< glm::vec3 > vecNormales = this->m_superficie.getNormales();
	std::vector< unsigned int > vecIndexBuffer = this->m_superficie.getIndexBuffer();
	std::vector< glm::vec2 > vecCoordsTextura = this->m_superficie.getCoordsTextura();

	glVertexPointer(3, GL_FLOAT, 0, &vecVertices[0]);
	glNormalPointer(GL_FLOAT, 0, &vecNormales[0]);
	glTexCoordPointer(2, GL_FLOAT, 0, &vecCoordsTextura[0]);
	glDrawElements(GL_TRIANGLES, vecIndexBuffer.size(), GL_UNSIGNED_INT, &vecIndexBuffer[0]);

	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glDisableClientState(GL_NORMAL_ARRAY);
	glDisableClientState(GL_VERTEX_ARRAY);
}


